package com.esil.project.util;

import java.io.File;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Vector;

import stemmer.stemmerTest;

/**
 * Classe permettant la recherche des images correspondant aux mots clés
 * 
 * @author sophie
 */
public class RechercheMotCle {

	String mots_requete[];
	Connection connection;
	ArrayList<double[]> vecteurs;
	ArrayList<String> img;
	ArrayList<String> array_url;
	double result[];

	/**
	 * Constructeur Récupère la chaine de caractère entrée dans la zone de
	 * recherche
	 * 
	 * @param chaine_requete
	 */
	public RechercheMotCle(String chaine_requete) {
		mots_requete = chaine_requete.split(" ");
		vecteurs = new ArrayList<double[]>();
		img = new ArrayList<String>();
		result = new double[10000];
		array_url = new ArrayList<String>();
	}

	/**
	 * Fonction permettant la recherche des images
	 */
	public void RechImg() {

		// chemin du dossier stopword pour le stemmer
		File destination = new File("");
		String Array[] = destination.getAbsolutePath().split("/");
		String cheminfinal = "";
		for (int i = 0; i < Array.length - 4; i++)
			cheminfinal += Array[i] + "/";
		cheminfinal = cheminfinal + "/workspace/multimedia_search_engine/";

		// calcul du mot racine
		ArrayList<String> racine = new ArrayList<String>();
		for (int i = 0; i < mots_requete.length; i++) {
			String temp = MotRacine(mots_requete[i], cheminfinal);
			if (temp != "")
				racine.add(temp);
		}

		/*
		 * for(int i=0;i<racine.size();i++) System.out.println(racine.get(i));
		 */

		// initialisation de la connexion
		InitConnexion();

		// calcul des poids de chaque image
		CalculPonderation(racine);

		// trie des images dans l'ordre décroissant
		System.out.println("\n\n\n\n\ntrie des images");
		trie();

	}

	/**
	 * trie des images sélectionnées dans l'ordre de pertinance
	 */
	public void trie() {

		

		int max;
		// tant qu'il y a des images non triées
		while (img.size() != 0) {
			max = 0;
			System.out.println("result[0]: "+result[0]);
			// on recupère celle ayant le plus grand poid
			for (int i = 1; i < img.size(); i++) {
				System.out.println("result: "+result[i]);
				if (result[i] > result[max]) {
					max = i;
				}
			}
			
			System.out.println("max= "+max
					+" image corresp: "+img.get(max));

			// ajout dans URL
			array_url.add(img.get(max));

			img.remove(max);
			for (int i = max; i < result.length - 1; i++)
				result[i] = result[i + 1];

		}
		
		System.out.println("\n **************************************\nimages triées");
		
		for (int i = 0; i < array_url.size(); i++)
			System.out.println(array_url.get(i));
	}

	/**
	 * Calcul du poid des images
	 * 
	 * @param racine
	 */
	public void CalculPonderation(ArrayList<String> racine) {

		// Pour chaque image de la BDD
		String sql = "SELECT id,url FROM indexation.META ";
		ResultSet resultset;
		try {
			resultset = connection.createStatement().executeQuery(sql);

			while (resultset.next()) {

				int id = resultset.getInt(1);
				String url = resultset.getString(2);

				int N = CalculN();

				// on calcule les vecteurs
				CalcVect(racine, id, N, url);

				// application de la formule somme(Xi)/sqrt(somme((Xi)2)
				/*double sommexi = 0;
				double sommexicarre = 0;*/
				double resultat;
				System.out.println("calcul de la somme");
				for (int i = 0; i < vecteurs.size(); i++) {
					double tab[] = vecteurs.get(i);
					/*for(int k=0;k<tab.length;k++)
					
					
						System.out.println("tab= "+tab[k]);*/
					
					double sommexi = 0;
					double sommexicarre = 0;
					
					for (int j = 0; j < tab.length; j++) {
						sommexi += tab[j];
						sommexicarre += (tab[j] * tab[j]);
						
					}
					
					System.out.println("sqrt: "+Math.sqrt(sommexicarre));
					double val=Math.sqrt(sommexicarre);
					
					//System.out.println("res: "+sommexi /val);
					/*resultat =(double) sommexi /val;

					System.out.println("sommexi: "+sommexi+
							" somme carre: "+sommexicarre+ " resultat: "+resultat);*/
					
					result[i] = sommexi;
				}
			}

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Calcul du nombre d'images dans la BDD
	 * 
	 * @return
	 */
	public int CalculN() {
		int N = 0;
		String sql = "SELECT id FROM indexation.META ";
		ResultSet resultset;
		try {
			resultset = connection.createStatement().executeQuery(sql);
			while (resultset.next()) {
				N++;
			}
		} catch (Exception e) {
		}

		return N;
	}

	/**
	 * Calcul des vecteurs à partie de tf et idf
	 * 
	 * @param racine
	 * @param idImage
	 * @param N
	 * @param url
	 */
	public void CalcVect(ArrayList<String> racine, int idImage, int N,
			String url) {
		int tab[] = new int[2];

		int tf;
		String sql = "SELECT tf,id_keyword FROM indexation.META_KEYWORD WHERE id_meta='"
				+ idImage + "'";

		ResultSet resultset;
		Boolean presente = false;
		try {
			resultset = connection.createStatement().executeQuery(sql);
			while (resultset.next()) {

				
				tf = resultset.getInt(1); // on garde le tf
				//System.out.println("tf= "+tf);
				tab[1] = resultset.getInt(2); // id du keyword

				try {

					sql = "SELECT racine,df FROM indexation.KEYWORD WHERE id='"
							+ tab[1] + "'";
					ResultSet resultset2 = connection.createStatement()
							.executeQuery(sql);

					double tableau[] = new double[N];
					int i = 0;
					while (resultset2.next()) {
						tableau[i] = 0;
						String test = resultset2.getString(1);

						// si au moins un mot de l'image est dans la recherche
						if (racine.contains(test)) {
							presente = true;

							// calcul du vecteur avec la formule:
							// W=tf*log(N/df)
							
							tableau[i] = tf
									* Math.log((double) (N / resultset2
											.getInt(2)));
							System.out.println("tf: "+tf+" N: "+N
									+" Df: "+resultset2
									.getInt(2)+ "tab[i]= "+tableau[i]);
						}
						i++;
					}

					// si il y a au moins un mot on ajoute le vecteur et l'url
					// correspondant
					// sinon ce n'est pas la peine
					if (presente) {
						if (!img.contains(url)) {
							vecteurs.add(tableau);
							img.add(url);
						}
					}

				} catch (Exception e) {
					e.printStackTrace();
				}

			}

		} catch (SQLException e) {
			System.out.println(e);
		}

	}

	/**
	 * Initialisation de la connexion
	 */
	public void InitConnexion() {
		// Connexion  la bdd
		ConnexionBDD connexionBDD = new ConnexionBDD();

		try {
			connection = connexionBDD.initConnection();

			/*
			 * Test d'interaction avec la base
			 */
			if (!connection.isClosed()) {
				System.out.println("Connexion reussie");
				// connection.createStatement().close();
			} else
				System.out.println("Echec de la connexion");
			// connection.close();

		} catch (Exception e) {
			System.out.println("erreur connexion: " + e);
		}
	}

	/**
	 * Recherche des mots racine
	 * 
	 * @param mot
	 * @param urlStopword
	 * @return
	 */
	public String MotRacine(String mot, String urlStopword) {
		stemmerTest stemmer = new stemmerTest(urlStopword);
		Vector v = stemmer.process(mot + "\n");
		String racine = "";
		if (v.size() > 0)
			racine = (String) v.elementAt(0);

		return racine;
	}

	public ArrayList<String> getArray_url() {
		return array_url;
	}
	
	

}
